package com.team2.hospital.config;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * GlobalExceptionHandler类用于全局异常处理。
 * 使用@ControllerAdvice注解，表明该类是一个全局异常处理器。
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 该方法用于处理所有类型的异常。
     * 使用@ExceptionHandler注解指定该方法处理Exception类的异常。
     *
     * @param e 异常对象
     * @return ResponseEntity 包含错误信息和HTTP状态码的响应体
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseEntity<String> handleException(Exception e) {
        // 获取异常的具体信息
        String message = e.getMessage();

        // 打印异常的堆栈跟踪信息，帮助调试
        e.printStackTrace();

        // 根据异常信息判断错误类型，并设置自定义的错误信息
        if (message.contains("(using password: YES)")) {
            // 如果是数据库连接错误，判断具体错误情况
            if (!message.contains("'root'@'")) {
                message = "PU Request failed with status code 500"; // 用户密码错误
            } else if (message.contains("'root'@'localhost'")) {
                message = "P Request failed with status code 500"; // 本地root用户连接失败
            }
        } else if (message.contains("Unknown database")) {
            // 数据库未知错误
            message = "U Request failed with status code 500";
        } else if (message.contains("Could not get a resource from the pool")) {
            // 无法从连接池获取资源
            message = "R Request failed with status code 500";
        } else if (message.contains("Failed to obtain JDBC Connection")) {
            // JDBC连接失败
            message = "C Request failed with status code 500";
        } else if (message.contains("SQLSyntaxErrorException")) {
            // SQL语法错误
            message = "S Request failed with status code 500";
        }

        // 返回自定义的错误信息和500的内部服务器错误状态码
        return new ResponseEntity<>(message, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
